import axios from 'axios'

import { Message } from 'element-ui' // ele框架

import router from '@/router' // 路由

import store from '@/store' // Vuex

import { get_timeStamp } from '@/utils/auth' // Cookies

// create an axios instance  （通过create创建了一个新的axios实例）
const service = axios.create({
  // 基本地址：
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // 超时时间：
  timeout: 5000 // request timeout
})

// 请求拦截器：
// request interceptor  （请求拦截器）
service.interceptors.request.use(config => {
  // 如果有Token
  if (store.getters.token) {
    // 如果时间戳到期了, 退出当前用户, 跳转到登录页
    if (is_tokenTimeStamp()) {
      store.dispatch('user/outLogin') // 退出登录
      // this.$router.push('/login') // 跳转=>登录页
      router.push('/login') // 跳转=>登录页
      Message.error('登录已超时，请重新登录')
    }
    // 给当前请求体的表头设置token
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  return config
}, error => {
// error 信息 里面 response的对象
  if (error.response && error.response.data && error.response.data.code === 10002) {
  // 当等于10002的时候 表示 后端告诉我token超时了
    store.dispatch('user/logout') // 登出action 删除token
    router.push('/login') // 跳转=>登录页
  } else {
    Message.error(error.message) // 提示错误信息
  }
  return Promise.reject(new Error(error.message))
})

// 响应拦截器：
// response interceptor  (相应拦截器)
service.interceptors.response.use(response => {
  const { success, message, data } = response.data
  if (success) {
    // console.log(message)
    // Message.success(message)                             // 傻逼提示
    return data
  } else {
    // console.log(message)
    Message.error(message)
    return Promise.reject(new Error(message))
  }
}, error => {
  console.dir(error)
  return Promise.reject(new Error(error))
})

const timeLimit = 1000 // 时间限制变量

// 方法：判断token时间戳是否过期
function is_tokenTimeStamp() {
  const curTime = Date.now() // 最新时间戳
  const timeStamp = get_timeStamp() // token注入时间戳
  // 用最新时间戳 减去 token注入时的时间戳, 再转换成 秒
  // 如果 秒 大于 timeLimit（时间限制）
  return (curTime - timeStamp) / 1000 > timeLimit
}

export default service
